/*
 * iPuertaEntrada.cpp
 *
 *  Created on: 05/07/2014
 *      Author: nicolas
 */

#include "iPuertaEntrada.h"
#include <syslog.h>
#include <stdio.h>
#include <sstream>
#include <unistd.h>

using namespace std;

iPuertaEntrada::iPuertaEntrada(int numeroPuerta, int id) {
	this->id = id;
	this->puerta = numeroPuerta;
	this->colaSistema = new ColaMensajes(RUTA, COLASISTEMA);
	this->colaRespuesta = new ColaInterfaz(RUTA, COLARECIBO_CLI);
}

void iPuertaEntrada::generarCorte() {
	stringstream id;
	id << this->id;
	int pid = fork();
	if (pid == 0) {
		execlp("./conexBrokerCliente", "conexBrokerCliente",
				id.str().c_str(), "E", NULL);
		perror("Error en el exec conexionBrokerCliente");
		exit(1);
	}
	pid = fork();
	if (pid == 0) {
		execlp("./conexBrokerCliente", "conexBrokerCliente",
				id.str().c_str(), "R", NULL);
		perror("Error en el exec conexionBrokerCliente");
		exit(1);
	}
}

bool iPuertaEntrada::permitiEntrar() {
	generarCorte();
	long int dest = rpc.consultarIdPuerta(puerta, Tipos::PUERTA_ENTRADA);
//	long int dest = idServer.idPuerta(puerta, Tipos::PUERTA_ENTRADA);
	MENSAJE msg;
	msg.destinatario = id;
	msg.destinatarioFinal = dest;
	msg.origen = id;
	msg.tipo = Tipos::MSJ_ENTRAR_A_PARQUE;
	colaSistema->enviar(&msg, TAM_MENSAJE);
	syslog(LOG_INFO,
			"Se envio el mensaje: destinatario: %li, origen: %li, id: %i, respuesta: %i",
			msg.destinatario, msg.origen, msg.id, msg.respuesta);

	//colaRespuesta->recibir(&msg, TAM_MENSAJE, id);
	colaRespuesta->recibirMensaje(msg,Tipos::MSJ_CONFIRMAR_ENTRADA_A_PARQUE , id);

	if (msg.tipo != Tipos::MSJ_CONFIRMAR_ENTRADA_A_PARQUE)
		syslog(LOG_ERR,
				"Error de tipo de mensaje esperado, esperado: %i, recibido: %i",
				(int) Tipos::MSJ_CONFIRMAR_ENTRADA_A_PARQUE, (int) msg.tipo);
	syslog(LOG_INFO,
			"Se recibio el mensaje: destinatario: %li, origen: %li, id: %i, respuesta: %i",
			msg.destinatario, msg.origen, msg.id, msg.respuesta);
	return msg.respuesta;
}
